{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 1、数组的添加"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[1 2 3]\n",
      " [4 5 6]]\n",
      "\n",
      "\n",
      " 向 数 组 添 加 元 素 ：\n",
      "[1 2 3 4 5 6 7 8 9]\n",
      "\n",
      "\n",
      "[[1 2 3]\n",
      " [4 5 6]]\n",
      "--------------------------------------------------\n",
      "2\n",
      "[[7 8 9]]\n",
      "--------------------------------------------------\n",
      "沿轴 0 添加元素：\n",
      "[[1 2 3]\n",
      " [4 5 6]\n",
      " [7 8 9]]\n",
      "\n",
      "\n",
      "[[1 2 3]\n",
      " [4 5 6]]\n",
      "沿轴 1 添加元素：\n",
      "[[1 2 3 5 5]\n",
      " [4 5 6 7 8]]\n",
      "[[1 2 3]\n",
      " [4 5 6]]\n",
      "--------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "# 1. numpy.append 函数在数组的末尾添加值。 追加操作会分配整个数组，并把原来的数组复制到新数组中。\n",
    "# 此外，输入数组的维度必须匹配，否则将生成ValueError。\n",
    "'''\n",
    "参 数 说 明 ：                                                                                                                                                           arr： 输 入 数 组                                                                                                                                               values：要向arr添加的值，需要和arr形状相同（除了要添加的轴）                                                                    axis：默认为 None。当axis无定义时，是横向加成，返回总是为一维数组！当axis有定义的时候，分别为0和1的时候。当\n",
    "axis有定义的时候，分别为0和1的时候（列数要相同）。当axis为1时，数组是加在右边（行数要相同）。\n",
    "'''\n",
    "import numpy as np\n",
    "\n",
    "a = np.array([[1, 2, 3], [4, 5, 6]])\n",
    "\n",
    "print('第一个数组：')\n",
    "print(a)\n",
    "print('\\n')\n",
    "\n",
    "print(' 向 数 组 添 加 元 素 ：')\n",
    "print(np.append(a, [7, 8, 9]))\n",
    "print('\\n')\n",
    "print(a)\n",
    "print('-'*50)\n",
    "b=np.array([[7, 8, 9]])\n",
    "print(b.ndim)\n",
    "print(b)\n",
    "print('-'*50)\n",
    "print('沿轴 0 添加元素：')\n",
    "print(np.append(a, [[7, 8, 9]], axis=0))\n",
    "print('\\n')\n",
    "print(a)\n",
    "print('沿轴 1 添加元素：')\n",
    "print(np.append(a, [[5, 5], [7, 8]], axis=1))\n",
    "print(a)\n",
    "print('-'*50)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "source": [
    "# # 2. numpy.insert\n",
    "# # 函数在给定索引之前，沿给定轴在输入数组中插入值。# 如果值的类型转换为要插入，则它与输入数组不同。\n",
    "# # 插入没有原地的，函数会返回一个新数组。 此外，如果未提供轴，则输入数组会被展开。\n",
    "\n",
    "a = np.array([[1, 2], [3, 4], [5, 6]])\n",
    "\n",
    "print('第一个数组：')\n",
    "print(a)\n",
    "print('\\n')\n",
    "\n",
    "print('未传递 Axis 参数。 在插入之前输入数组会被展开。')\n",
    "print(np.insert(a,1, [11, 12]))\n",
    "print('\\n')\n",
    "print(np.insert(a,1, [11, 12],axis=0))\n",
    "# print('传递了 Axis 参数。 会广播值数组来配输入数组。')\n",
    "\n",
    "print('沿轴  0 广播：')\n",
    "print(np.insert(a, 1, 11, axis=0))\n",
    "print('\\n')\n",
    "\n",
    "print('沿轴  1 广播：')\n",
    "print(np.insert(a, 1, 11, axis=1))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "execution_count": 2,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[1 2]\n",
      " [3 4]\n",
      " [5 6]]\n",
      "\n",
      "\n",
      "未传递 Axis 参数。 在插入之前输入数组会被展开。\n",
      "[ 1 11 12  2  3  4  5  6]\n",
      "\n",
      "\n",
      "[[ 1  2]\n",
      " [11 12]\n",
      " [ 3  4]\n",
      " [ 5  6]]\n",
      "沿轴  0 广播：\n",
      "[[ 1  2]\n",
      " [11 11]\n",
      " [ 3  4]\n",
      " [ 5  6]]\n",
      "\n",
      "\n",
      "沿轴  1 广播：\n",
      "[[ 1 11  2]\n",
      " [ 3 11  4]\n",
      " [ 5 11  6]]\n"
     ]
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 2、数组的删除"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[[ 2  3  4  5]\n",
      " [ 6  7  8  9]\n",
      " [10 11 12 13]]\n",
      "\n",
      "\n",
      "未传递 Axis 参数。 在删除之前输入数组会被展开。\n",
      "[ 2  3  4  5  6  8  9 10 11 12 13]\n",
      "\n",
      "\n",
      "[[ 2  3  4  5]\n",
      " [ 6  7  8  9]\n",
      " [10 11 12 13]]\n",
      "删除第一行：\n",
      "[[ 2  3  4  5]\n",
      " [10 11 12 13]]\n",
      "\n",
      "\n",
      "[[ 2  4  5]\n",
      " [ 6  8  9]\n",
      " [10 12 13]]\n",
      "--------------------------------------------------\n",
      "[[ 2  5]\n",
      " [ 6  9]\n",
      " [10 13]]\n"
     ]
    }
   ],
   "source": [
    "#numpy.delete 函数返回从输入数组中删除指定子数组的新数组。 与 insert() 函数的情况一样，\n",
    "# 如果未提供轴参数， 则输入数组将展开。\n",
    "'''\n",
    "参 数 说 明 ：\n",
    "arr： 输 入 数 组\n",
    "obj：可以被切片np._s[]，整数或者整数数组，表明要从输入数组删除的子数组axis：\n",
    "沿着它删除给定子数组的轴，如果未提供，则输入数组会被展开\n",
    "'''\n",
    "\n",
    "a = np.arange(2,14).reshape(3,4)\n",
    "\n",
    "print('第一个数组：')\n",
    "print(a)\n",
    "print('\\n')\n",
    "\n",
    "print('未传递 Axis 参数。 在删除之前输入数组会被展开。')\n",
    "print(np.delete(a,5))\n",
    "print('\\n')\n",
    "print(a)\n",
    "print('删除第一行：')\n",
    "print(np.delete(a,1,axis = 0))\n",
    "print('\\n')\n",
    "\n",
    "\n",
    "print(np.delete(a,1,axis = 1))\n",
    "print('-'*50)\n",
    "print(np.delete(a,np.s_[1:3],axis = 1))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 3、数组的去重"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一个数组：\n",
      "[5 2 6 2 7 5 6 9 8 2 0]\n",
      "\n",
      "\n",
      "第一个数组的去重值：\n",
      "[0 2 5 6 7 8 9]\n",
      "去重数组的索引数组：\n",
      "[0 2 5 6 7 8 9]\n",
      "[10  1  0  2  4  8  7]\n",
      "我们可以看到每个和原数组下标对应的数值：\n",
      "去重数组的下标：\n",
      "[0 2 5 6 7 8 9]\n",
      "[2 1 3 1 4 2 3 6 5 1 0]\n",
      "\n",
      "\n",
      "返回去重元素的重复数量：\n",
      "[0 2 5 6 7 8 9]\n",
      "[1 3 2 2 1 1 1]\n"
     ]
    }
   ],
   "source": [
    "# numpy.unique 函数用于去除数组中的重复元素。\n",
    "'''\n",
    "arr：输入数组，如果不是一维数组则会展开\n",
    "return_index：如果为true，返回新列表元素在旧列表中的位置（下标），并以列表形式储\n",
    "return_inverse：如果为true，返回旧列表元素在新列表中的位置（下标），并以列表形式储\n",
    "return_counts：如果为true，返回去重数组中的元素在原数组中的出现次数\n",
    "'''\n",
    "import numpy as np\n",
    "a = np.array([5,2,6,2,7,5,6,9,8,2,0])\n",
    "\n",
    "print ('第一个数组：')\n",
    "print (a)\n",
    "print ('\\n')\n",
    "\n",
    "#去除重复元素，输出的是有序序列\n",
    "print ('第一个数组的去重值：')\n",
    "u = np.unique(a)\n",
    "print (u)\n",
    "# print ('\\n')\n",
    "\n",
    "print ('去重数组的索引数组：')\n",
    "u,indices = np.unique(a, return_index = True)\n",
    "print(u)\n",
    "print (indices)\n",
    "# print ('\\n')\n",
    "\n",
    "print ('我们可以看到每个和原数组下标对应的数值：')\n",
    "print ('去重数组的下标：')\n",
    "u,indices = np.unique(a,return_inverse = True)\n",
    "print (u)\n",
    "print (indices)\n",
    "print ('\\n')\n",
    "\n",
    "print ('返回去重元素的重复数量：')\n",
    "u,indices = np.unique(a,return_counts = True)\n",
    "print (u)\n",
    "print (indices)\n",
    "\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}